﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OracleClient;
using System.Data;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data.Oracle;
using System.Configuration;
using System.Xml;
using System.Windows.Markup;
using System.Windows;
using System.IO;
using System.Windows.Forms;
using Infra.LanguageGenerator;

namespace Sinacor.Infra.Tools.LanguageGenerator
{
    public class DataAccess
    {
        DbConnection cnn = null;
        const int CODIGOSTATUSTRADUCAO = 0;
        const int CODIGOIDIOMA = 1;
        const int CODIGOMENSAGEM = 2;
        const int MODULO = 3;
        const int SUBMODULO = 4;

        public DataAccess()
        {
            
        }

        public void Dispose()
        {
            CloseConnection();
        }

        private void CloseConnection()
        {
            Log.Instance.Escreve("Fechando a conexão");
            cnn.Close();
            cnn.Dispose();
        }

        private void OpenConnection()
        {
            string connectionString = ConfigurationSettings.AppSettings["connectionString"].ToString();
            Log.Instance.Escreve("Abrindo conexão: " + connectionString);
            OracleDatabase db = new OracleDatabase(connectionString);
            cnn = db.CreateConnection();
            cnn.Open();
        }

        public DateTime GetLanguageLastChange()
        {
            Log.Instance.Escreve("Obtendo a ultima atualização da Exceção");
            DateTime dtReturn = DateTime.MinValue;
            StringBuilder sql = new StringBuilder();;

            OpenConnection();

            DbCommand cmd = cnn.CreateCommand();

            sql.Append("SELECT ULTIMA_ATUALIZACAO FROM TFWDEXCECAOATUALIZACAO");

            cmd.CommandText = sql.ToString();
            DbDataReader dr = cmd.ExecuteReader();

            if (dr.Read())
            {
                dtReturn = dr.GetDateTime(0);
            }

            dr.Close();
            dr.Dispose();

            CloseConnection();

            return dtReturn;
        }

        public List<LanguageInfo> GetLanguages()
        {
            Log.Instance.Escreve("Obtendo as Linguagens");
            
            List<LanguageInfo> languages = new List<LanguageInfo>();
            StringBuilder sql = new StringBuilder();

            OpenConnection();

            DbCommand cmd = cnn.CreateCommand();

            sql.Append("SELECT CODIGOIDIOMA, NOMEIDIOMA, SIGLAIDIOMA FROM TFWDIDIOMA ORDER BY SIGLAIDIOMA");

            cmd.CommandText = sql.ToString();
            DbDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                LanguageInfo language = new LanguageInfo();
                
                language.Codigo = dr.GetInt32(0);
                language.Nome = dr.GetString(1);
                language.Sigla = dr.GetString(2);

                languages.Add(language);

            }

            dr.Close();
            dr.Dispose();

            CloseConnection();

            return languages;
        }

        public List<XamlInfo> GetLanguageXAML(string module, int LanguageCode)
        {
            Log.Instance.Escreve("Obtendo as Linguagens XAML");
            
            string subModuloHelper = "";
            List<XamlInfo> xamls = new List<XamlInfo>();
            StringBuilder sql = new StringBuilder();
            StringBuilder sqlInfo = new StringBuilder();
            ResourceDictionary resource = new ResourceDictionary();
            XamlInfo xamlInfo;

            OpenConnection();

            DbCommand cmd = cnn.CreateCommand();

            // Alteração realizada em 29/05/2009 devido modificação na modelagem -- rcfernandes.7comm
            sql.Append(@"SELECT MAX(TM.CODIGOSTATUSTRADUCAO), T.CODIGOIDIOMA, TM.CODIGOMENSAGEM, M.MODULO, M.SUBMODULO
                        FROM TFWDMENSAGEM M 
                        INNER JOIN TFWDTRADUCAOMENSAGEM TM 
                          ON M.CODIGOMENSAGEM = TM.CODIGOMENSAGEM
                        INNER JOIN TFWDSTATUSTRADUCAO ST
                          ON ST.CODIGOSTATUSTRADUCAO = TM.CODIGOSTATUSTRADUCAO
                        INNER JOIN TFWDTXT_MSG T
                        ON T.COD_TXT_MSG = TM.COD_TXT_MSG
                        INNER JOIN TFWDIDIOMA I 
                          ON I.CODIGOIDIOMA = T.CODIGOIDIOMA
                        WHERE I.CODIGOIDIOMA = :CodigoIdioma AND M.MODULO = :Modulo
                        GROUP BY T.CODIGOIDIOMA, TM.CODIGOMENSAGEM, M.MODULO, M.SUBMODULO
                        ORDER BY M.MODULO, M.SUBMODULO, TM.CODIGOMENSAGEM");


            
            
            DbParameter paramCodigoIdioma = cmd.CreateParameter();
            paramCodigoIdioma.ParameterName = "CodigoIdioma";
            paramCodigoIdioma.DbType = DbType.Int32;
            paramCodigoIdioma.Value = LanguageCode;

            DbParameter paramModulo = cmd.CreateParameter();
            paramModulo.ParameterName = "Modulo";
            paramModulo.DbType = DbType.String;
            paramModulo.Value = module;
            
            cmd.Parameters.Add(paramCodigoIdioma);
            cmd.Parameters.Add(paramModulo);

            cmd.CommandText = sql.ToString();
            
            DbDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {

                //Busca descrição e resource key da mensagem
                sqlInfo.Remove(0, sqlInfo.Length);

                // Alteração realizada em 29/05/2009 devido modificação na modelagem -- rcfernandes.7comm
                sqlInfo.Append(@"SELECT M.RESOURCEKEY, T.TXT_MSG AS MENSAGEM
                                FROM TFWDMENSAGEM M 
                                INNER JOIN TFWDTRADUCAOMENSAGEM TM
                                ON M.CODIGOMENSAGEM = TM.CODIGOMENSAGEM
                                INNER JOIN TFWDTXT_MSG T
                                ON TM.COD_TXT_MSG = T.COD_TXT_MSG
                                WHERE T.CODIGOIDIOMA = :CodigoIdioma
                                AND TM.CODIGOSTATUSTRADUCAO = :CodigoStatusTraducao
                                AND TM.CODIGOMENSAGEM = :CodigoMensagem ");


                DbCommand cmdInfo = cnn.CreateCommand();

                DbParameter paramCodigoMensagem = cmd.CreateParameter();
                paramCodigoMensagem.ParameterName = "CodigoMensagem";
                paramCodigoMensagem.DbType = DbType.Int32;
                paramCodigoMensagem.Value = dr.GetInt32(CODIGOMENSAGEM);

                DbParameter paramStatusTraducao = cmd.CreateParameter();
                paramStatusTraducao.ParameterName = "CodigoStatusTraducao";
                paramStatusTraducao.DbType = DbType.Int32;
                paramStatusTraducao.Value = dr.GetInt32(CODIGOSTATUSTRADUCAO);

                DbParameter paramCodigoIdioma2 = cmd.CreateParameter();
                paramCodigoIdioma2.ParameterName = "CodigoIdioma";
                paramCodigoIdioma2.DbType = DbType.Int32;
                paramCodigoIdioma2.Value = LanguageCode;

                cmdInfo.Parameters.Add(paramCodigoMensagem);
                cmdInfo.Parameters.Add(paramStatusTraducao);
                cmdInfo.Parameters.Add(paramCodigoIdioma2);

                cmdInfo.CommandText = sqlInfo.ToString();
                DbDataReader drInfo = cmdInfo.ExecuteReader();

                if (drInfo.Read())
                {
                    //Verifica se existe módulo
                    if (subModuloHelper != dr["SUBMODULO"].ToString())
                    {
                        if (!String.IsNullOrEmpty(subModuloHelper))
                        {
                            if (resource.Count > 0)
                            {
                                xamlInfo = new XamlInfo();
                                xamlInfo.SubModulo = subModuloHelper;
                                xamlInfo.XamlBody = XamlWriter.Save(resource);
                                xamls.Add(xamlInfo);
                            }
                        }

                        resource = new System.Windows.ResourceDictionary();

                    }
                    resource.Add(drInfo["RESOURCEKEY"].ToString(), drInfo["MENSAGEM"].ToString());
                }

                subModuloHelper = dr["SUBMODULO"].ToString();
                drInfo.Close();
                
            }

            if (resource.Count > 0)
            {
                xamlInfo = new XamlInfo();
                xamlInfo.SubModulo = subModuloHelper;
                xamlInfo.XamlBody = XamlWriter.Save(resource);
                xamls.Add(xamlInfo);
            }

            dr.Close();
            dr.Dispose();

            CloseConnection();

            return xamls;
        }
    }
}